"""
https://leetcode.cn/problems/reverse-linked-list/description/


206. 反转链表
已解答
简单
相关标签
相关企业
给你单链表的头节点 head ，请你反转链表，并返回反转后的链表。
 

示例 1：


输入：head = [1,2,3,4,5]
输出：[5,4,3,2,1]
示例 2：


输入：head = [1,2]
输出：[2,1]
示例 3：

输入：head = []
输出：[]
 

提示：

链表中节点的数目范围是 [0, 5000]
-5000 <= Node.val <= 5000
 

进阶：链表可以选用迭代或递归方式完成反转。你能否用两种方法解决这道题？

"""

# Definition for singly-linked list.
class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next
from typing import Optional


class Solution:
    """
    尽管仍然可以使用s024那种，利用list实现
    但这个如果用迭代并不麻烦

    实际像交通中用到的杆子那样，将中间节点的杆子从后挪至前边
    """

    def reverseList(self, head: Optional[ListNode]) -> Optional[ListNode]:
        if head is None:
            return None
        temp1=None
        temp2=head
        temp3=head.next
        temp2.next=temp1
        while temp3 is not None:
            temp1=temp2
            temp2=temp3
            temp3=temp3.next
            temp2.next=temp1
            
        return temp2

if __name__=='__main__':
    head=ListNode(1,ListNode(2,ListNode(3,ListNode(4,ListNode(5)))))
    res=Solution().reverseList(head)
    while res is not None:
        print(res.val)
        res=res.next